# data_manager.py
import threading

class DataManager:
    _instance = None
    _lock = threading.Lock() # 用于线程安全

    def __new__(cls, *args, **kwargs):
        """
        控制实例的创建过程。如果实例不存在，则创建；否则返回已存在的实例。
        加锁是为了防止在多线程环境下同时创建多个实例。
        """
        if cls._instance is None:
            with cls._lock:
                # 再次检查，防止在等待锁的过程中，其他线程已经创建了实例
                if cls._instance is None:
                    print("创建DataManager的新实例…")
                    cls._instance = super().__new__(cls)
                    # 在这里初始化数据，只执行一次
                    cls._instance._config = {}
                    cls._instance._cache = {}
        return cls._instance

    def __init__(self):
        """
        注意：__init__ 在每次获取实例时都会被调用！
        所以初始化代码应该放在 __new__ 中，或者用标志位保护。
        """
        # pass # 什么都不做，因为初始化已经在 __new__ 中完成
        if not hasattr(self, '_initialized'):
            print("初始化DataManager……")
            # 也可以把初始化放在这里，但需要用标志位防止重复执行
            self._initialized = True

    def get_config(self, key):
        return self._config.get(key)

    def set_config(self, key, value):
        self._config[key] = value
        print(f"配置修改: {key} = {value}")

    def cache_data(self, key, value):
        self._cache[key] = value
        print(f"数据缓存: {key}")

    def get_cached_data(self, key):
        # 如果没有就返回None
        return self._cache.get(key, None)

    def clear_cache(self):
        self._cache.clear()
        print("缓存已清空")

    def get_cached_data_or_none(self, key):
        return self._cache.get(key)

